package com.example.demo.threadSafeAll;

import lombok.Data;

/**
 * 线程生产者与向消费者最基本实现
 * 1、数据不匹配通过同步机制已经解决
 * 2、重复取数据问题通过等待唤醒机制已经解决
 * 当flag为true时允许生产者生产，若此时消费者进入则要等待
 * 当flag为false时允许消费者取出信息，若此时生产者进入则要等待
 */
@Data
public class VoAll {
    private String name;
    private String role;
    /**
     *  设置标示位：true是生产的时间，false是消费的时间。第一次先生产
     */
    private static boolean flag = true;

    public synchronized void setVo(String name, String role){
        if(!flag){
            //消费时间，生产线程需要等待
            try {
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.name = name;
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.role = role;

        flag = false;
        super.notify();
    }

    public synchronized void getVo(){
        if(flag){
            //生产时间，消费线程需要等待
            try {
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(this.name + "------饰演------" + this.role);

        flag = true;
        super.notify();
    }
}
